#include "xuexi.h"
#include "ui_xuexi.h"

xuexi::xuexi(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::xuexi)
{
    ui->setupUi(this);
    //初始化
    for (int i=0;i<4;i++)
    {
        for (int j=0;j<4;j++)
        {
            s[i][j]=0;
        }
    }

    button=new QPushButton("开始游戏",this);
    button->setGeometry(60,400,200,50);
    //随机函数
    qsrand(uint(QTime(0,0,0).secsTo(QTime:: currentTime())));


    //槽与信号
           connect(button,SIGNAL(clicked()),this,SLOT(slotStart()));
}

xuexi::~xuexi()
{
    delete ui;
}
void xuexi::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setBrush(Qt::blue);
    p.setFont(QFont("微软雅黑",20,700,false));
    p.drawText(QPoint(20,60),"分数："+QString::number((score)));


    //格子实现
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            p.setPen(Qt::transparent);
            if(s[i][j]==0)
            {
                p.setBrush((Qt::gray));
                p.drawRect(i*60+40,j*60+120,55,55);
            }
            if (s[i][j]==2)
            {
                //实现2，4，6，8，16等数字格子
                 p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/two"));

            }
            if (s[i][j]==4)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/four"));


            }
            if (s[i][j]==8)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/eight"));


            }
            if (s[i][j]==16)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/sixteen"));


            }
            if (s[i][j]==32)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/threetwo"));

            }
            if (s[i][j]==64)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/sixfour"));

            }
            if (s[i][j]==128)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/onetwoeight"));

            }
            if (s[i][j]==256)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/twofivesix"));


            }
            if (s[i][j]==512)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/fiveonetwo"));

            }
            if (s[i][j]==1024)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/onezero"));

            }
            if (s[i][j]==2048)
            {

                p.drawPixmap(i*60+40,j*60+120,55,55,QPixmap(":/pic/phtot/twozero"));


            }
        }
    }

}
void xuexi::keyPressEvent(QKeyEvent *event)
{


     switch (event->key())
     {
     case Qt::Key_W:
     Pressup();
     break;
     case Qt::Key_S:
     Pressdown();
     break;
     case Qt::Key_A:
     Pressleft();
     break;
     case Qt::Key_D:
     Pressright();
     break;
     default:
         return;
     }
     //
     myRand();
     update();//强制页面更新
 }
void xuexi::slotStart(){
        QMessageBox::about(this,"游戏规则","WASD控制");
        score=0;
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                s[i][j]=0;
            }
        }

        button->setText("重新游戏");

        int ri=qrand()%4;//0到4的数字
        int rj=qrand()%4;
        s[ri][rj]=2;
        update();
 }

void xuexi::Pressup()
{
    //移动格子
    for (int i=0;i<4;i++)
    {
        for(int j=1;j<4;j++)
        {
            if(s[i][j]==0)continue;
            for(int p=0;p<j;p++)
            {
                if(s[i][p]==0)
                {
                    s[i][p]=s[i][j];
                    s[i][j]=0;
                    break;
                }
            }
        }
    }
    //格子相加
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<3;j++)
        {
            if(s[i][j]==s[i][j+1])
            {
                s[i][j]=2*s[i][j];
                s[i][j+1]=0;
                score+=s[i][j];
                for(int p=j+2;p<4;p++)
                {
                    s[i][p-1]=s[i][p];
                }
            }
        }
    }
}
void xuexi::Pressdown()
{
    for (int i=0;i<4;i++)
    {
        for(int j=2;j>=0;j-- )
        {
            if(s[i][j]==0)continue;
            for(int p=3;p>j;p--)
            {
                if(s[i][p]==0)
                {
                    s[i][p]=s[i][j];
                    s[i][j]=0;
                    break;
                }
            }
        }
    }
    //格子相加
    for(int i=0;i<4;i++)
    {
        for(int j=3;j>0;j--)
        {
            if(s[i][j]==s[i][j-1])
            {
                s[i][j]=2*s[i][j];
                s[i][j-1]=0;
                score+=s[i][j];
                for(int p=j-2;p>=0;p--)
                {
                    s[i][p+1]=s[i][p];
                }
            }
        }
    }
}
void xuexi::Pressleft()
{
   for (int j=0;j<4;j++)
   {
       for(int i=1;i<4;i++)
       {
           if(s[i][j]==0)continue;
           for(int p=0;p<i;p++)
           {
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
       }
   }
   //格子相加
   for(int j=0;j<4;j++)
   {
       for(int i=0;i<3;i++)
       {
           if(s[i][j]==s[i+1][j])
           {
               s[i][j]=2*s[i][j];
               s[i+1][j]=0;
               score+=s[i][j];
               for(int p=i+2;p<4;p++)
               {
                   s[p-1][j]=s[p][j];
               }
           }
       }
   }
}
void xuexi::Pressright()
{
    for (int j=0;j<4;j++)
    {
        for(int i=2;i>=0;i--)
        {
            if(s[i][j]==0)continue;
            for(int p=3;p>i;p--)
            {
                if(s[p][j]==0)
                {
                    s[p][j]=s[i][j];
                    s[i][j]=0;
                    break;
                }
            }
        }
    }
    //格子相加
    for(int j=0;j<4;j++)
    {
        for(int i=3;i>=0;i--)
        {
            if(s[i][j]==s[i-1][j])
            {
                s[i][j]=2*s[i][j];
                s[i-1][j]=0;
                score+=s[i][j];
                for(int p=i-2;p>=0;p--)
                {
                    s[p+1][j]=s[p][j];
                }
            }
        }
    }
}
 void xuexi::myRand()
 {
     int i=0,j=0;
         //找出格子
         struct Na n[15];
         int ni=0;
         for (i=0;i<4;i++) {
             for (j=0;j<4;j++) {
                 if(s[i][j]==0){
                     n[ni].i=i;
                     n[ni].j=j;
                     ni++;
                 }
             }
         }

         //判断游戏是否结束
         if (ni==0) {
             for (i=0;i<4;i++) {
                 for (j=0;j<3;j++) {
                     if(s[i][j]==s[i][j+1]){
                         return;
                     }
                 }
             }
             for (j=0;j<4;j++) {
                 for (i=0;i<3;i++) {
                     if(s[i][j]==s[i+1][j]){
                         return;
                     }
                 }
             }
             QMessageBox::about(this,"游戏失败","分数为："+QString::number(score)+" ");
             return;
         }
         int r=qrand()%ni;
         s[n[r].i][n[r].j]=2;
 }
